package com.ewzj.bigdata.app.utils

import java.util.regex.Matcher
import java.util.regex.Pattern

/**
 * author:zhangjing
 * 作用:
 * return:
 */
object RegExpValidatorUtils {
    /**
     * 验证邮箱

     * @param ""
     * *
     * @return 如果是符合的字符串,返回 **true **,否则为 **false **
     */
    fun isEmail(str: String): Boolean {
        val regex = "^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$"
        return match(regex, str)
    }

    /**
     * 验证IP地址

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun isIP(str: String): Boolean {
        val num = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)"
        val regex = "^$num\\.$num\\.$num\\.$num$"
        return match(regex, str)
    }

    /**
     * 验证网址Url

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsUrl(str: String): Boolean {
        val regex = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?"
        return match(regex, str)
    }

    /**
     * 验证电话号码

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsTelephone(str: String): Boolean {
        val regex = "^(\\d{3,4}-)?\\d{6,8}$"
        return match(regex, str)
    }

    /**
     * 验证输入密码条件(字符与数据同时出现)

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsPassword(str: String): Boolean {
        val regex = "[A-Za-z]+[0-9]"
        return match(regex, str)
    }

    /**
     * 验证输入密码长度 (6-18位)

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsPasswLength(str: String): Boolean {
        val regex = "^\\d{6,18}$"
        return match(regex, str)
    }

    /**
     * 验证输入邮政编号

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsPostalcode(str: String): Boolean {
        val regex = "^\\d{6}$"
        return match(regex, str)
    }

    /**
     * 验证输入手机号码

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsHandset(str: String): Boolean {
        val regex = "^[1]+[3,4,5,7,8]+\\d{9}$"
        return match(regex, str)
    }

    /**
     * 验证输入身份证号

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsIDcard(str: String): Boolean {
        val regex = "(^\\d{18}$)|(^\\d{15}$)"
        return match(regex, str)
    }

    /**
     * 验证输入两位小数

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsDecimal(str: String): Boolean {
        val regex = "^[0-9]+(.[0-9]{2})?$"
        return match(regex, str)
    }

    /**
     * 验证输入一年的12个月

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsMonth(str: String): Boolean {
        val regex = "^(0?[[1-9]|1[0-2])$"
        return match(regex, str)
    }

    /**
     * 验证输入一个月的31天

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsDay(str: String): Boolean {
        val regex = "^((0?[1-9])|((1|2)[0-9])|30|31)$"
        return match(regex, str)
    }

    /**
     * 验证日期时间

     * @param ""
     * *
     * @return 如果是符合网址格式的字符串,返回 **true **,否则为 **false **
     */
    fun isDate(str: String): Boolean {
        // 严格验证时间格式的(匹配[2002-01-31], [1997-04-30],
        // [2004-01-01])不匹配([2002-01-32], [2003-02-29], [04-01-01])
        // String regex =
        // "^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$";
        // 没加时间验证的YYYY-MM-DD
        // String regex =
        // "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$";
        // 加了时间验证的YYYY-MM-DD 00:00:00
        val regex = "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d$"
        return match(regex, str)
    }

    /**
     * 验证数字输入

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsNumber(str: String): Boolean {
        val regex = "^[0-9]*$"
        return match(regex, str)
    }

    /**
     * 验证非零的正整数

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsIntNumber(str: String): Boolean {
        val regex = "^\\+?[1-9][0-9]*$"
        return match(regex, str)
    }

    /**
     * 验证大写字母

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsUpChar(str: String): Boolean {
        val regex = "^[A-Z]+$"
        return match(regex, str)
    }

    /**
     * 验证小写字母

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsLowChar(str: String): Boolean {
        val regex = "^[a-z]+$"
        return match(regex, str)
    }

    /**
     * 验证验证输入字母

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsLetter(str: String): Boolean {
        val regex = "^[A-Za-z]+$"
        return match(regex, str)
    }

    /**
     * 验证验证输入汉字

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsChinese(str: String): Boolean {
        val regex = "^[\u4e00-\u9fa5],{0,}$"
        return match(regex, str)
    }

    /**
     * 验证验证输入字符串

     * @param ""
     * *
     * @return 如果是符合格式的字符串,返回 **true **,否则为 **false **
     */
    fun IsLength(str: String): Boolean {
        val regex = "^.{8,}$"
        return match(regex, str)
    }

    /**
     * @param regex
     * * 正则表达式字符串
     * *
     * @param str
     * * 要匹配的字符串
     * *
     * @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;
     */
    private fun match(regex: String, str: String): Boolean {
        val pattern = Pattern.compile(regex)
        val matcher = pattern.matcher(str)
        return matcher.matches()
    }

    // 3. 检查字符串重复出现的词
    //
    // private void btnWord_Click(object sender, EventArgs e)
    // {
    // System.Text.RegularExpressions.MatchCollection matches =
    // System.Text.RegularExpressions.Regex.Matches(label1.Text,
    //
    // @"\b(?<word>\w+)\s+(\k<word>)\b",
    // System.Text.RegularExpressions.RegexOptions.Compiled |
    // System.Text.RegularExpressions.RegexOptions.IgnoreCase);
    // if (matches.Count != 0)
    // {
    // foreach (System.Text.RegularExpressions.Match match in matches)
    // {
    // string word = match.Groups["word"].Value;
    // MessageBox.Show(word.ToString(),"英文单词");
    // }
    // }
    // else { MessageBox.Show("没有重复的单词"); }
    //
    //
    // }
    //
    // 4. 替换字符串
    //
    // private void button1_Click(object sender, EventArgs e)
    // {
    //
    // string strResult =
    // System.Text.RegularExpressions.Regex.Replace(textBox1.Text,
    // @"[A-Za-z]\*?", textBox2.Text);
    // MessageBox.Show("替换前字符:" + "\n" + textBox1.Text + "\n" + "替换的字符:" + "\n"
    // + textBox2.Text + "\n" +
    //
    // "替换后的字符:" + "\n" + strResult,"替换");
    //
    // }
    //
    // 5. 拆分字符串
    //
    // private void button1_Click(object sender, EventArgs e)
    // {
    // //实例: 甲025-8343243乙0755-2228382丙029-32983298389289328932893289丁
    // foreach (string s in
    // System.Text.RegularExpressions.Regex.Split(textBox1.Text,@"\d{3,4}-\d*"))
    // {
    // textBox2.Text+=s; //依次输出 "甲乙丙丁"
    // }
    //
    // }

}
